package com.pan.framework.core.container;

import com.pan.framework.anno.aop.MyAspect;
import com.pan.framework.anno.controller.MyController;
import com.pan.framework.entity.BeanInfo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

public  class MyContainer {
    private HashMap<String,BeanInfo> containerMap;



    public MyContainer() {
        containerMap = new HashMap<>();
    }

    public List<BeanInfo> getBeanByAnnotation(Class anno){
        return containerMap.entrySet().stream()
                .filter(m->m.getValue().getClazz().isAnnotationPresent(anno))
                .map(m->m.getValue())
                .collect(Collectors.toList());
    }

    public List<BeanInfo> getController(){
        return getBeanByAnnotation(MyController.class);
    }
    public List<BeanInfo> getAspect(){
        return getBeanByAnnotation(MyAspect.class);
    }
    public Collection<String> getAllBeanName(){
        return containerMap.entrySet()
                .stream().map(m->m.getKey())
                .collect(Collectors.toCollection(ArrayList::new));
    }
    public void resetBean(BeanInfo beanInfo){
        containerMap.put(beanInfo.getName(),beanInfo);
    }
    public void addBean(BeanInfo beanInfo){
        String name = beanInfo.getName();
        if (containerMap.containsKey(name)){
            throw new RuntimeException("对象名称重复: "+name);
        }
        containerMap.put(name, beanInfo);
    }

    public void addBeans(Collection<BeanInfo> beanInfos){
        beanInfos.forEach(this::addBean);
    }

    public BeanInfo getBean(String name){
        if (containerMap.containsKey(name)){
            return containerMap.get(name);
        }else {
            return null;
        }
    }

    public boolean exists(String name){
        if (containerMap.containsKey(name)){
            return true;
        }
        return false;
    }

}


//public  class MyContainer {
//    private HashMap<String, BeanInfo> daoMap;
//    private HashMap<String,BeanInfo> serverMap;
//    private HashMap<String,BeanInfo> controllerMap;
//
//    private HashMap<String,BeanInfo> otherMap;
//    private HashMap<String,Map<String,BeanInfo>> allBeanMap;
//    {
//        daoMap = new HashMap<>();
//        serverMap = new HashMap<>();
//        controllerMap = new HashMap<>();
//        otherMap = new HashMap<>();
//        allBeanMap = new HashMap<>();
//    }
//    public MyContainer() {
//
//    }
//
//
//    public boolean addDaoBean(String name,BeanInfo bi){
//        return addBean(daoMap,name,bi);
//    }
//
//    public boolean addServerBean(String name,BeanInfo bi){
//        return addBean(serverMap,name,bi);
//    }
//
//    public boolean addControllerBean(String name,BeanInfo bi){
//        return addBean(controllerMap,name,bi);
//    }
//
//    public boolean addOtherBean(String name,BeanInfo bi){
//        return addBean(otherMap,name,bi);
//    }
//
//    protected boolean addBean(Map map,String name,BeanInfo bi){
//        if (existName(allBeanMap,name)){
//            return false;
//        }
//        allBeanMap.put(name,map);
//        map.put(name,bi);
//        return true;
//    }
//
//    private static boolean existName(Map map,String name){
//        return map.containsKey(name);
//    }
//
//
//    public  BeanInfo getBean(String name){
//        if (existName(allBeanMap,name)){
//            return allBeanMap.get(name).get(name);
//        }
//        return null;
//    }
//
//    public HashMap<String, BeanInfo> getDaoMap() {
//        return daoMap;
//    }
//    public HashMap<String, BeanInfo> getServerMap() {
//        return serverMap;
//    }
//    public HashMap<String, BeanInfo> getControllerMap() {
//        return controllerMap;
//    }
//    public HashMap<String, BeanInfo> getOtherMap() {
//        return otherMap;
//    }
//    public HashMap<String, Map<String, BeanInfo>> getAllBeanMap() {
//        return allBeanMap;
//    }
//}
